package net.esj.basic.dao.jdbc.jpa;

import java.util.List;
/**
 * 基本从JPA剽窃来的。
 * 但JPA的规范根据其JQL的内容来决定返回对象的类型，我们不太会定义一套新的QL。
 * 但如何处理select count(*) from table的情况，现在提供了
 * getResultList(ResultSetExtractor extractor)和getSingleResult(ResultSetExtractor extractor)
 * 两个方法，即ResultSetExtractor的机制。
 * 另外又提供了
 * getSingleColumnResult和getSingleColumnResultList两个快捷方法。
 * 
 * 本接口现在在Support里提供了一个抽象实现QuerySupport，因为不同数据库里有些处理是不同的，特别是分页，
 * 所以针对不同数据库，还要提供自己的具体实现。
 * 
 * ！！！不明确声明异常的话，是有些危险的，使用者可能不会对运行时异常进行处理从而导致有不关闭连接。
 */
public interface Query
{
	/**
	 * 返回查询结果集。
	 * 目前的实现List的元素由extractor决定。
	 * @return
	 */
    List getResultList(ResultSetExtractor extractor);
	/**
	 * 返回查询结果。
	 * 目前返回的元素类型由extractor决定。
	 * @return
	 */
    Object getSingleResult(ResultSetExtractor extractor);
    /**
     * 将结果集处理成使用JPA标注的实体类对象。
     * @param entityType
     * @return
     */
	public List getResultListAs(Class entityType);
    /**
     * 将结果集处理成使用JPA标注的实体类对象。
     * @param entityType
     * @return
     */
	public Object getSingleResultAs(Class entityType);
    /**
     * 将结果集处理成Map对象。
     * @param entityType
     * @return
     */
	public List getResultListAsMap();
    /**
     * 将结果集处理成Map对象。
     * @param entityType
     * @return
     */
	public Object getSingleResultAsMap();
    /**
     * 针对单字段情况的处理。
     * @return
     */
    Object getSingleColumnResult();
    /**
     * 针对单字段情况的处理。
     * @return
     */
    List getSingleColumnResultList();
    
    /**
     * 修改操作。
     * @return
     */
    int executeUpdate();
    /**
     * 返回的最大记录数。
     * 用户分页和hibernate类似。
     * @param i
     * @return
     */
    Query setMaxResults(int i);
    /**
     * 起始记录位置。
     * 从0开始。
     * @param i
     * @return
     */
    Query setFirstResult(int i);
    /**
     * 设置参数。
     * 如select * from tableName where colName1=#colName1#
     * 目前尚未实现。
     * @param s
     * @param obj
     * @return
     */
    Query setParameter(String s, Object obj);

    /**
     * 设置参数。
     * 已经实现。
     * @param i
     * @param obj
     * @return
     */
    Query setParameter(int i, Object obj);
    void setSql(String sql);
    void setSession(Session session);
}
